# 作用域
# 变量生效的范围
# 全局变量
# 局部变量
# a = 10
# def func1():
#     print(a)
# def func2():
#     a = 20
#     print(a)
# func1()
# func2()

# global
# 在函数内部修改全局变量的值，可以使用global
# global将变量声明成全局变量
# def func():
#     global a
#     a = 20
#     print(a)
# func()
# print(a)

# nonlocal
# 用来声明外层的局部变量，在外部函数中先进行声明，内部函数中用nonlocal声明
# 只能对上一级进行修改
# 只能在嵌套函数中使用
# a = 10
# def outer():
#     a = 20
#     def inner():
#         a = 30
#         def inner2():
#             nonlocal a
#             a = 40
#             print(f"inner2 a ={a}")
#         inner2()
#         print(f"inner a ={a}")
#     inner()
#     print(f"outer a ={a}")
# outer()
# print("a =", a)

# 匿名函数（lambda函数）
# 函数名 = lambda 形参 : 返回值（表达式）
# add = lambda x, y: x + y
# print(add(1, 2))
# lambda 的参数形式
# 无参数
# function = lambda : print("Hello")
# function()
# 多参数
# function = lambda x, y: x * y
# print(function(1, 2))
# 默认参数
# function = lambda x, y = 1, z = 0 : x + y + z
# print(function(1))
# 关键字参数
# function = lambda **kwargs : kwargs.items()
# print(function(keyword = "key", value = "value"))

# a = 8
# b = 5
# print("a <= b") if a <= b else print("a > b")
# function = lambda a, b: "a <= b" if a <= b else "a > b"
# print(function(1, 3))

# 内置函数
# 查看所有的内置函数
import builtins

# print(dir(builtins))
# 大写字母一般是内置常量名,小写字母开头一般是内置函数名
# abs()求绝对值
# sum()求和
# print(sum([1,2,3]))

# min()求最小值
# max()求最大值
# print(min(1,2,-6, key=abs))     #比较绝对值
# print(max(1,2,-6, key=abs))

# zip()将可迭代对象作为参数,打包成一个个元组
# list1 = [1, 2, 3, 4, 5]
# list2 = ['a', 'b', 'c', 'd']
# for i in zip(list1, list2):
#     print(i)
# print(list(zip(list1, list2)))

# map()对可迭代对象中的每一个元素进行映射,分别去执行
# 简单来说就是对象中的每一个元素都会去执行这个函数
# list1 = [1, 2, 3]
# def add(a):
#     return a + 5
# print(map(add, list1))
# for i in map(add, list1):     #用for循环取出
#     print(i, type(i))
# print(list(map(add, list1)))    #转换成列表打印

# reduce(function,sequence)  先把对象中的两个元素取出来,计算出一个值保存,这个值再跟第三个元素进行计算,以此类推
# function 必须是有两个参数的函数
# sequence 序列,可迭代对象
# from functools import reduce
# def function(x, y):
#     return x + y
# list1 = [1, 2, 3, 4, 5]
# print(reduce(function, list1))

# 拆包
# 对于函数中的多个返回数据，去掉元组、字典或列表，直接获取里面数据的过程
# tua = (1, 2, 3, 4)
# a, b, c, d = tua        #元组内的个数与接受的个数相同
# print(a, b, c, d)
# 一般在获取元组值的时候使用

# def func(a, b, *args):
#     print(a, b,type(a),type(b))
#     print(args,type(args))
# func(1, 2, 3, 4, 5)
# list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# func(*list1)        #这里*list1表示函数参数在这个位置可以接收任意多个非关键字参数
# 一般在函数调用时使用